package etm.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import etm.excepcion.DAOExcepcion;
import upc.condominio.modelo.Estado;
import upc.condominio.modelo.Queja;
import upc.condominio.modelo.Residente;
import upc.condominio.util.ConexionBD;

public class ResidenteDAO extends BaseDAO {

	public Collection<Residente> buscarPorDato(String dato) throws DAOExcepcion {
		System.out.println("ResidenteDAO: buscarPorDato(String dato)");
		String strQuery =	" select r.idresidente, r.documento, r.apellidopaterno, r.apellidomaterno, r.nombres, r.fechanacimiento, r.email, r.idestado, r.clave " +
							" from residente r " +
							" where r.ApellidoMaterno like ? or r.ApellidoPaterno like ? or r.Nombres like ? ;";
		Collection<Residente> lista = new ArrayList<Residente>();
		Estado estEstado = null;
		EstadoDAO daoEstado = new EstadoDAO();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setString(1, "%" + dato + "%");
			stmt.setString(2, "%" + dato + "%");
			stmt.setString(3, "%" + dato + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Residente vo = new Residente();
				vo.setIdResidente(rs.getInt("idresidente"));				
				vo.setDni(rs.getString("documento"));
				vo.setApePaterno(rs.getString("ApellidoPaterno"));
				vo.setApeMaterno(rs.getString("ApellidoMaterno"));
				vo.setNombres(rs.getString("nombres"));
				vo.setFechaNac(rs.getDate("fechanacimiento"));
				vo.setEmail(rs.getString("email"));
				vo.setClave(rs.getString("clave"));
				//Estado
				estEstado = daoEstado.BuscarporId(rs.getString("idestado"));
				vo.setEsEstado(estEstado);
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Collection<Residente> listar() throws DAOExcepcion {
		System.out.println("ResidenteDAO: listar()");
		Collection<Residente> c = new ArrayList<Residente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		Estado estEstado = null;
		EstadoDAO daoEstado = new EstadoDAO();
		
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT idresidente, documento, apellidopaterno, apellidomaterno, nombres, idestado, email, fechanacimiento, clave from Residente order by 2,3,4;";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Residente vo = new Residente();
				vo.setIdResidente(rs.getInt("idresidente"));
				vo.setDni(rs.getString("documento"));
				vo.setApePaterno(rs.getString("apellidopaterno"));
				vo.setApeMaterno(rs.getString("apellidomaterno"));
				vo.setNombres(rs.getString("nombres"));
				vo.setFechaNac(rs.getDate("fechanacimiento"));
				vo.setEmail(rs.getString("email"));
				vo.setClave(rs.getString("clave"));
				//Estado
				estEstado = daoEstado.BuscarporId(rs.getString("idestado"));
				vo.setEsEstado(estEstado);
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Residente buscarporId(int intIdResidente) throws DAOExcepcion {
		Residente res =null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		Estado estEstado = null;
		EstadoDAO daoEstado = new EstadoDAO();
		
		try {
			con = ConexionBD.obtenerConexion();
			String StrQuery = 	" SELECT idresidente, documento, apellidopaterno, apellidomaterno, nombres, idestado, email, fechanacimiento, clave " + 
							" from Residente " +
							" where idresidente = ?";
			stmt = con.prepareStatement(StrQuery);
			stmt.setInt(1, intIdResidente);
			rs = stmt.executeQuery();
			while (rs.next()) {
				res = new Residente();
				res.setIdResidente(rs.getInt(1));
				res.setDni(rs.getString(2));
				res.setApePaterno(rs.getString(3));
				res.setApeMaterno(rs.getString(4));
				res.setNombres(rs.getString(5));
				
				//Estado
				estEstado = daoEstado.BuscarporId(rs.getString(6));
				res.setEsEstado(estEstado);
				
				res.setEmail(rs.getString(7));
				res.setFechaNac(rs.getDate(8));
				res.setClave(rs.getString(9));
				break;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return res;
	}
	
	public void insertar(Residente vo) throws DAOExcepcion {
		System.out.println("ResidenteDAO: insertar(Residente vo)");
		String strQuery = 	" INSERT INTO residente(documento, apellidopaterno, apellidomaterno, nombres, fechanacimiento, email, clave, idestado) "+
							" VALUES (?,?,?,?,?,?,?,'AC')";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setString(1, vo.getDni());
			stmt.setString(2, vo.getApePaterno());
			stmt.setString(3, vo.getApeMaterno());
			stmt.setString(4, vo.getNombres());
			stmt.setDate(5, vo.getFechaNac());
			stmt.setString(6, vo.getEmail());
			stmt.setString(7, vo.getClave());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar en Residente");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void eliminar(int intIdResidente) throws DAOExcepcion {
		System.out.println("ResidenteDAO: eliminar(int intIdResidente)");
		String StrQuery = "Update residente set idestado ='IN' WHERE idresidente=?; ";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			Residente q = buscarporId(intIdResidente);
			
//			if (q.getEstEstado().getIdEstado().equalsIgnoreCase("AN")) {
//				throw new SQLException("el registro ya se encuentra anulado.");
//			}
			
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(StrQuery);
			stmt.setInt(1, intIdResidente);
			int i = stmt.executeUpdate();
			if (i != 1) {

				throw new SQLException("No se pudo anular el registro.");
//				return false;
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
//			return false;
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
//		return true;
	}
	
	public void actualizar(Residente vo) throws DAOExcepcion {
		System.out.println("ResidenteDAO: actualizar(Residente vo)");
		String query = "update residente set documento=?, apellidopaterno=?, apellidomaterno=?, nombres=?,fechanacimiento=?, email=?, clave=?  where idresidente=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getDni());
			stmt.setString(2, vo.getApePaterno());
			stmt.setString(3, vo.getApeMaterno());
			stmt.setString(4, vo.getNombres());
			stmt.setDate(5, vo.getFechaNac());
			stmt.setString(6, vo.getEmail());
			stmt.setString(7, vo.getClave());
			stmt.setInt(8, vo.getIdResidente());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar el registro residente");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Residente buscarPorCorreo(String correo) throws DAOExcepcion {
		Residente res =null;
		int idResidente = 0;
		Connection con = null, con1=null;
		PreparedStatement stmt = null, stmt1=null;
		ResultSet rs = null, rs1=null;
		
		try {
			con = ConexionBD.obtenerConexion();
			String StrQuery = 	"SELECT idResidente from Usuario where correo=?";			
			stmt = con.prepareStatement(StrQuery);
			stmt.setString(1, correo);
			rs = stmt.executeQuery();
			while (rs.next()) {
				idResidente = rs.getInt("idResidente");
			break;
			}
			res=buscarporId(idResidente);
//			con1 = ConexionBD.obtenerConexion();
//			String StrQuery1 = 	" SELECT idresidente, documento, apellidopaterno, apellidomaterno, nombres " + 
//					" from Residente " +
//					" where idresidente = ?";			
//			stmt1 = con1.prepareStatement(StrQuery1);
//			stmt1.setInt(1, idResidente);
//			rs1 = stmt1.executeQuery();
//			
//			while (rs1.next()) {
//				res = new Residente();
//				res.setIdResidente(rs.getInt(1));
//				res.setDni(rs.getString(2));
//				res.setApeMaterno(rs.getString(3));
//				res.setApePaterno(rs.getString(4));
//				res.setNombres(rs.getString(5));
//				break;
//			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return res;
	}
}
